package com.general.framework.core.schema;

import com.general.framework.core.lang.Lists;
import com.general.framework.core.lang.Beans;
import io.swagger.annotations.ApiModel;
import lombok.Data;

import java.io.Serializable;
import java.util.List;

/**
 * 公共的分页结果
 * @author leejean
 */
@Data
@ApiModel("公共的分页结果")
public final class PageResult<E> implements Serializable {

    /**
     * 数据
     */
    private List<E> rows;

    /**
     * 总记录数
     */
    private Long total;

    public PageResult() {

    }

    public PageResult(final List<E> rows, final Long total) {
        this.rows = rows;
        this.total = total;
    }

    /**
     * 集合对象转换
     *
     * @param rows
     * @param <E>
     * @return
     */
    public final static <E> PageResult<E> of(final List<E> rows) {
        if (rows == null || rows.isEmpty()) {
            return PageResult.empty();
        }
        final long total = Integer.valueOf(rows.size()).longValue();
        return new PageResult<>(rows, total);
    }

    /**
     * 转换为其它PageResult对象
     *
     * @param page
     * @param clazz
     * @param <E>
     * @return
     */
    public final static <E> PageResult<E> of(final PageResult<?> page, Class<E> clazz) {
        final List<E> items = Beans.copyList(page.getRows(), clazz);
        return new PageResult<>(items, page.getTotal());
    }

    public final static <E> List<E> ofList(final PageResult<?> page, Class<E> clazz) {
        return Beans.copyList(page.getRows(), clazz);
    }

    /**
     * 空对象
     *
     * @param <E>
     * @return
     */
    public final static <E> PageResult<E> empty() {
        return new PageResult<>(Lists.emptyList(), 0L);
    }

}
